﻿class logLevels {
    static trace = 1;
    static debug = 2;
    static info = 4;
    static warn = 8;
    static error = 16;
    static fatal = 32;
}

class logerCore {
    static primitiveGenerateInfo(level, time, ex, msg) {
        if (ex) {
            if (msg) {
                msg = msg + ex;
            } else {
                msg = ex;
            }
        }

        if (msg == null || msg == undefined) {
            msg = "";
        }

        //level:    0:trace;1:debug;2:info;3:warn;4:error;5:fatal
        let levelText = null;
        switch (level) {
            case logLevels.trace:
                levelText = "追踪";
                break;
            case logLevels.debug:
                levelText = "调试";
                break;
            case logLevels.info:
                levelText = "信息";
                break;
            case logLevels.warn:
                levelText = "警告";
                break;
            case logLevels.error:
                levelText = "错误";
                break;
            case logLevels.fatal:
                levelText = "致命";
                break;
            default:
                levelText = "未知";
                break;
        }

        return time.toLocaleString() + " " + levelText + " " + msg;
    }

    /**
     * 
     * @param {any} level 0:trace;1:debug;2:info;3:warn;4:error;5:fatal
     * @param {any} ex
     * @param {any} msg
     * @returns
     */
    static generateInfo(level, ex, msg) {
        return logerCore.primitiveGenerateInfo(level, new Date(), ex, msg);
    }

    _outputLog = null;
    get outputLog() {
        return loger._outputLog;
    }
    set outputLog(value) {
        if (value == undefined) {
            value = null;
        }

        loger._outputLog = value;
    }

    //level:    0:trace;1:debug;2:info;3:warn;4:error;5:fatal
    primitveOutputlog(msg, level) {
        if (loger._outputLog != null) {
            loger._outputLog(msg, level);
        }
    }


    log(level, time, msg) {
        var infoMsg = logerCore.primitiveGenerateInfo(level, time, null, msg);
        switch (level) {
            case logLevels.trace:
            case logLevels.debug:
                console.debug(infoMsg);
                break;
            case logLevels.info:
                console.info(infoMsg);
                break;
            case logLevels.warn:
                console.warn(infoMsg);
                break;
            case logLevels.error:
            case logLevels.fatal:
                console.error(infoMsg);
                break;
            default:
                console.info(infoMsg);
                break;
        }
       
        this.primitveOutputlog(infoMsg, level);
    }

    //trace
    trace(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.trace, null, msg);
        console.debug(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.trace);
    }
    trace(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.trace, ex, msg);
        console.debug(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.trace);
    }

    //debug
    debug(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.debug, null, msg);
        console.debug(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.debug);
    }
    debug(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.debug, ex, msg);
        console.debug(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.debug);
    }

    //info
    info(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.info, null, msg);
        console.info(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.info);
    }
    info(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.info, ex, msg);
        console.info(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.info);
    }

    //warn
    warn(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.warn, null, msg);
        console.warn(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.warn);
    }
    warn(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.warn, ex, msg);
        console.warn(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.warn);
    }

    //error
    error(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.error, null, msg);
        console.error(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.error);
    }
    error(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.error, ex, msg);
        console.error(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.error);
    }

    //fatal
    fatal(msg) {
        var infoMsg = logerCore.generateInfo(logLevels.fatal, null, msg);
        console.fatal(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.fatal);
    }
    fatal(ex, msg) {
        var infoMsg = logerCore.generateInfo(logLevels.fatal, ex, msg);
        console.fatal(infoMsg);
        this.primitveOutputlog(infoMsg, logLevels.fatal);
    }
}

class loger {
    static _logerIns = null;
    static get logerIns() {
        return loger._logerIns;
    }
    static set logerIns(logerIns) {
        if (logerIns == undefined) {
            logerIns = null;
        }

        loger._logerIns = logerIns;
    }


    //log
    static log(level, time, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.primitiveGenerateInfo(level, time, null, msg);
        }
        else {
            loger._logerIns.log(level, time, msg);
        }
    }
    //trace
    static trace(msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.trace, null, msg);
            switch (level) {
                case logLevels.trace:
                case logLevels.debug:
                    console.debug(infoMsg);
                    break;
                case logLevels.info:
                    console.info(infoMsg);
                    break;
                case logLevels.warn:
                    console.warn(infoMsg);
                    break;
                case logLevels.error:
                case logLevels.fatal:
                    console.error(infoMsg);
                    break;
                default:
                    console.info(infoMsg);
                    break;
            }
        }
        else {
            loger._logerIns.trace(msg);
        }
    }
    static trace(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.trace, ex, msg);
            console.debug(infoMsg);
        }
        else {
            loger._logerIns.trace(ex, msg);
        }
    }

    //debug
    static debug(msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.debug, null, msg);
            console.debug(infoMsg);
        }
        else {
            loger._logerIns.debug(msg);
        }
    }
    static debug(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.debug, ex, msg);
            console.debug(infoMsg);
        }
        else {
            loger._logerIns.debug(ex, msg);
        }
    }

    //info
    static info(msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.info, null, msg);
            console.info(infoMsg);
        }
        else {
            loger._logerIns.info(msg);
        }
    }
    static info(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.info, ex, msg);
            console.info(infoMsg);
        }
        else {
            loger._logerIns.info(ex, msg);
        }
    }

    //warn
    static warn(msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.warn, null, msg);
            console.warn(infoMsg);
        }
        else {
            loger._logerIns.warn(msg);
        }
    }
    static warn(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.warn, ex, msg);
            console.warn(infoMsg);
        }
        else {
            loger._logerIns.warn(ex, msg);
        }
    }

    //error
    static error(msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.error, null, msg);
            console.error(infoMsg);
        }
        else {
            loger._logerIns.error(msg);
        }
    }
    static error(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.error, ex, msg);
            console.error(infoMsg);
        }
        else {
            loger._logerIns.error(ex, msg);
        }
    }

    //fatal
    static fatal(msg) {
        if (loger._logerIns == null) {
            loger.primitveOutputlog(infoMsg, logLevels.fatal);
            console.error(infoMsg);
        }
        else {
            loger._logerIns.fatal(msg);
        }
    }
    static fatal(ex, msg) {
        if (loger._logerIns == null) {
            var infoMsg = logerCore.generateInfo(logLevels.fatal, ex, msg);
            console.error(infoMsg);
        }
        else {
            loger._logerIns.fatal(ex, msg);
        }
    }
}